package logica.clases;


import java.sql.SQLException;



import persistencia.DAOException;
import persistencia.IAbstractFactory;
import persistencia.PersistenciaException;
import persistencia.DAOs.IDAOEmpleados;
import persistencia.DAOs.IDAOEmpresas;
import logica.datatypes.DataAsalariado;
import logica.datatypes.DataEmpleado;
import logica.datatypes.DataEmpresa;
import logica.datatypes.DataFreelance;
import logica.datatypes.DataPagos;
//
//
//
//  @ Archivo : FACADE.java
//  @ Fecha : 03/12/2010
//  @ Author : IUASP
//
//





public class Facade {
	//private IAbstractFactory iaf;
	private IDAOEmpresas daoEmpresas;		//para mi no va
	private IDAOEmpleados daoEmpleados;
	
	
	public Facade() throws PersistenciaException, InstantiationException, IllegalAccessException, ClassNotFoundException {
		IAbstractFactory iaf = (IAbstractFactory) Class.forName("persistencia.FabricaConcretaMySQL").newInstance();
		
		daoEmpresas = iaf.crearDAOEmpresas();	
		daoEmpleados = iaf.crearDAOEmpleados();
	}
	
	//saco los TipoError ya que debemos manejarlo como excepciones (EmpresaException, etc.)
	
	
	public void agregarEmpresa(DataEmpresa dataEmpresa)throws DAOException, InstantiationException, IllegalAccessException, ClassNotFoundException, PersistenciaException, SQLException {
			
			int rut = dataEmpresa.getRut();
			
			if (daoEmpresas.member(rut))
				throw new DAOException(1);
			else{
				daoEmpresas.insert(dataEmpresa);
			}
		}
		
	public void eliminarEmpresa(int rut) throws PersistenciaException, SQLException, DAOException, ClassNotFoundException {
		
		if (!daoEmpresas.member(rut))
			throw new DAOException(2);
		else{
			if (daoEmpresas.tieneEmpleados(rut))
				throw new DAOException(3);
			else
				daoEmpresas.Eliminar(rut);
		}
	}
	
	public void modificarEmpresa(DataEmpresa dataEmpresa) throws PersistenciaException, SQLException, DAOException, ClassNotFoundException {

		int rut = dataEmpresa.getRut();
		
		if (!daoEmpresas.member(rut))
			throw new DAOException(2);
		else
			daoEmpresas.modificarEmpresa(dataEmpresa);

	}
	
	public void agregarEmpleado(DataEmpleado dataEmpleado) throws PersistenciaException, SQLException, DAOException, ClassNotFoundException {
		
		int rut = dataEmpleado.getRutEmpresa();
		
		if (!daoEmpresas.member(rut))
			throw new DAOException(2);
		else{
			daoEmpleados.agregar(dataEmpleado);	
		}
	}
	
	public void eliminarEmpleado(int ci) throws DAOException, PersistenciaException, SQLException, ClassNotFoundException {
		
		if (!daoEmpleados.existeEmpleado(ci))
			throw new DAOException(5);
		else{
			daoEmpleados.borrarEmpleado(ci);
		}
	}
	
	public void modificarEmpleado(DataEmpleado dataEmpleado) throws PersistenciaException, SQLException, DAOException, ClassNotFoundException {
		
		int ci = dataEmpleado.getCi();
		
		if (!daoEmpleados.existeEmpleado(ci))
			throw new DAOException(4);
		else{
			daoEmpleados.modificarEmpleado(dataEmpleado); 			
		}
	}
	
	public DataEmpleado obtenerEmpleado(int ci) throws DAOException, PersistenciaException, SQLException, ClassNotFoundException {

		if (!daoEmpleados.existeEmpleado(ci))
			throw new DAOException(5);
		else
			return daoEmpleados.obtenerEmpleado(ci);
	
	}
	
	public DataEmpresa obtenerEmpresa(int rut) throws DAOException, SQLException, PersistenciaException, ClassNotFoundException {

		if (!daoEmpresas.member(rut))
			throw new DAOException(2);
		else{
			return daoEmpresas.find(rut);
		}
		
	}
	
	public DataEmpresa[] listadoEmpresas() throws SQLException, ClassNotFoundException, PersistenciaException {
		return daoEmpresas.listadoEmpresas();
	}
	
	public DataEmpleado[] listadoEmpleadosEmpresa(int rut) throws PersistenciaException, SQLException, ClassNotFoundException {
		return daoEmpleados.listadoEmpleadosEmpresa(rut);
	}
	
	public DataEmpleado[] listadoEmpleados() throws PersistenciaException, SQLException, ClassNotFoundException {
		return daoEmpleados.listadoEmpleados();
	}
	
	public DataPagos[] listadoPagos() throws SQLException, ClassNotFoundException, PersistenciaException {	
		
		DataEmpresa[] dataEmpresas = daoEmpresas.listadoEmpresas();
		DataEmpleado[] dataEmpleados;
		int i, j, cantEmpleados, cantEmpresas;
		float pagoMensual;
		
		cantEmpresas = dataEmpresas.length;
		DataPagos[] dataPagos = new DataPagos[cantEmpresas];
		
		for (i=0;i<cantEmpresas;i++){									//Por cada empresa traigo sus empleados	
			pagoMensual = 0;
			dataEmpleados = daoEmpleados.listadoEmpleadosEmpresa(dataEmpresas[i].getRut());
			
			cantEmpleados = dataEmpleados.length;
			for (j=0;j<cantEmpleados;j++){								//Por cada dataempleado, creo un empleado del tipo correcto y le calculo el sueldo
				Empleado empleado;
				if (dataEmpleados[j] instanceof DataFreelance){			
					empleado = new Freelance ( dataEmpleados[j],(DataFreelance)dataEmpleados[j] );
				}else{
					empleado = new Asalariado ( dataEmpleados[j],(DataAsalariado)dataEmpleados[j]);
				}
				pagoMensual = pagoMensual + empleado.salarioMensual();
			}
																		//Creo el datapago en el array
			dataPagos[i] = new DataPagos(dataEmpresas[i].getRut(),dataEmpresas[i].getRazon_Social(),pagoMensual);
		}

		return dataPagos;
	}
}
